home *** CD-ROM | disk | FTP | other *** search
/ JCSM Shareware Collection 1993 November / JCSM Shareware Collection - 1993-11.iso / cl720 / sst115j.lzh / DEMO.C < prev    next >
C/C++ Source or Header  |  1992-07-18  |  24KB  |  865 lines

  1. /* ------------------------------------------------------------------------ */
  2. /*                                  demo.c                                  */
  3. /*                       main demo of the SST toolkit                       */
  4. /* ------------------------------------------------------------------------ */
  5. #include <dos.h>
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <mem.h>
  9. #include <stdlib.h>
  10. #include <conio.h>
  11. #include <alloc.h>
  12.  
  13. #include "sstvid.h"
  14. #include "sstkey.h"
  15. #include "sstwin.h"
  16. #include "sstmnu.h"
  17. #include "ssthlp.h"
  18. #include "sstedt.h"
  19.  
  20. /* ------------------------------------------------------------------------ */
  21. /*                            functions prototypes                          */
  22. /* ------------------------------------------------------------------------ */
  23. void wtitles     (void);
  24. void waccent     (void);
  25. void wfast     (void);
  26. void wmove     (void);
  27. void editor     (void);
  28. void entry     (void);
  29. void entryall    (void);
  30. void video     (void);
  31. void lists     (void);
  32. void mainmenu     (void);
  33.  
  34. static void help_date    (char *bf);
  35. static void get_list     (int s);
  36. static void help_state   (char *bf);
  37.  
  38. /* ------------------------------------------------------------------------ */
  39. int randx(int min, int max)
  40. {
  41.     int x;
  42.  
  43.     while ( (x = rand() % max+1) < min);
  44.     return(x);
  45. }
  46.  
  47. /* ------------------------------------------------------------------------ */
  48. /*                         demo on windows titles                           */
  49. /* ------------------------------------------------------------------------ */
  50. void wtitles(void)
  51. {
  52.     WINDOW *wnd;
  53.     int t, c = 0;
  54.  
  55.  
  56.     Hset("wtitles ", 20, 15);
  57.     wnd = Westablish(5, 4, 5, 51);
  58.     Wsetcolour(wnd,WIN_BORDER, LIGHTGRAY, WHITE, DIM);
  59.     Wsetcolour(wnd,WIN_TITLE , LIGHTGRAY, RED,BRIGHT);
  60.     Wsetcolour(wnd,WIN_ACCENT, GREEN,     BLACK, DIM);
  61.     Wsetcolour(wnd,WIN_FACE,   LIGHTGRAY, BLACK, DIM);
  62.     Wsettitle(wnd,"[Window Title Demo]",JUST_L);
  63.     Wprintf(wnd,"\n    Window Titles may be modified at any time\n");
  64.     Wprintf(wnd,"            and the title string may be \n");
  65.     Wprintf(wnd,"          LEFT RIGHT or CENTRE  justified");
  66.     Wshow(wnd);
  67.     while (c != ESC)  {
  68.       if (kbhit())
  69.              c = kgetch();
  70.       delay(400);
  71.       t = randx(0,4);
  72.          while ( (t = randx(0,4)) == 3);
  73.       Wsettitle(wnd,"[Window Title Demo]",t);
  74.     }
  75.      Wdelete(wnd);
  76. }
  77.  
  78. /* ------------------------------------------------------------------------ */
  79. /*                         demo on windows borders                          */
  80. /* ------------------------------------------------------------------------ */
  81. void wborders(void)
  82. {
  83.     WINDOW *wnd;
  84.     int t = 0, c = 0;
  85.  
  86.  
  87.     Hset("wtitles ", 20, 15);
  88.     wnd = Westablish(5, 4, 11, 60);
  89.     Wsetcolour(wnd,WIN_BORDER, BLACK,     WHITE, BRIGHT);
  90.     Wsetcolour(wnd,WIN_TITLE , BLACK,     CYAN,  BRIGHT);
  91.     Wsetcolour(wnd,WIN_FACE,   LIGHTGRAY, BLACK, DIM);
  92.     Wsettitle(wnd,"[Window Border Demo]",JUST_L);
  93.     Wprintf(wnd,"      Window Borders may be modified at any time\n\n");
  94.     Wprintf(wnd,"      BRD_SINGLE        - Single line border \n");
  95.     Wprintf(wnd,"      BRD_DOUBLE        - Double line border \n");
  96.     Wprintf(wnd,"      BRD_DOUBLETOP     - Single sides & Double top\n");
  97.     Wprintf(wnd,"      BRD_DOUBLESIDES   - Single top & Double sides\n");
  98.     Wprintf(wnd,"      BRD_SPACES        - Border made of spaces\n");
  99.     Wprintf(wnd,"      BRD_NOBORDER      - No border, uses full window");
  100.     Wshow(wnd);
  101.     while (c != ESC)  {
  102.       if (kbhit())
  103.              c = kgetch();
  104.       delay(400);
  105.       t++;
  106.       if (t > 4)
  107.          t = 0;
  108.       Wsetborder(wnd,t);
  109.  
  110.     }
  111.      Wdelete(wnd);
  112. }
  113.  
  114. /* ------------------------------------------------------------------------ */
  115. /*                          demo on windows colours                         */
  116. /* ------------------------------------------------------------------------ */
  117. void wcolours(void)
  118. {
  119.     WINDOW *wnd[3];
  120.     int c = 0;
  121.     int bg, fg;
  122.  
  123.  
  124.     Hset("wtitles ", 20, 15);
  125.     wnd[0] = Westablish(5, 4, 8, 30);
  126.     wnd[1] = Westablish(45, 4, 8, 30);
  127.     wnd[2] = Westablish(5, 14, 8, 30);
  128.     Wsettitle(wnd[0],"[Window 0]",JUST_L);
  129.     Wsettitle(wnd[1],"[Window 1]",JUST_C);
  130.     Wsettitle(wnd[2],"[Window 2]",JUST_R);
  131.     Wshow(wnd[0]);
  132.     Wshow(wnd[1]);
  133.     Wshow(wnd[2]);
  134.     Wprintf(wnd[0],"Demo of Window\n");
  135.     Wprintf(wnd[1],"Demo of Window\n");
  136.     Wprintf(wnd[2],"Demo of Window\n");
  137.     Wprintf(wnd[0],"FACE colour\n");
  138.     Wprintf(wnd[1],"BORDER colour\n");
  139.     Wprintf(wnd[2],"TITLE colour\n");
  140.     while (c != ESC)  {
  141.       if (kbhit())
  142.              c = kgetch();
  143.       delay(400);
  144.       fg = randx(0,7);
  145.          while ( (bg = randx(0,7)) == fg);
  146.       Wsetcolour(wnd[0], WIN_FACE, fg, bg, BRIGHT);
  147.       fg = randx(0,7);
  148.          while ( (bg = randx(0,7)) == fg);
  149.       Wsetcolour(wnd[1], WIN_BORDER, fg, bg, BRIGHT);
  150.       fg = randx(0,7);
  151.          while ( (bg = randx(0,7)) == fg);
  152.       Wsetcolour(wnd[2], WIN_TITLE, fg, bg, BRIGHT);
  153.     }
  154.  
  155.     Wdelete(wnd[0]);
  156.     Wdelete(wnd[1]);
  157.     Wdelete(wnd[2]);
  158. }
  159.  
  160.  
  161. char *cols[] = {
  162.       "BLACK","BLUE","GREEN","CYAN","RED","MAGENTA","BROWN",
  163.       "LIGHTGRAY","DARKGRAY","LIGHTBLUE","LIGHTGREEN",
  164.       "LIGHTCYAN","LIGHTRED","LIGHTMAGENTA","YELLOW","WHITE"
  165. };
  166.  
  167. /* ------------------------------------------------------------------------ */
  168. /*                           demo on windows                                */
  169. /* ------------------------------------------------------------------------ */
  170. void windowsdemo(void)
  171. {
  172.     WINDOW *wnd;
  173.     int cc,c;
  174.     char **s;
  175.  
  176.     Hset("wtitles ", 20, 15);
  177.     wnd = Westablish(1, 1, 4, 40);
  178.     Wshow(wnd);
  179.     for (cc = 1 ; cc < 8 ; cc++)  {
  180.     s = cols;
  181.     for (c = 1 ; c < 16 ; c++)  {
  182.            Wsetcolour(wnd, WIN_FACE, c, cc, DIM);
  183.            Wsetcolour(wnd, WIN_BORDER, c, cc, DIM);
  184.            Wsettitle(wnd, *++s,JUST_C);
  185.     }
  186.     }
  187.     kgetch();
  188.     Wdelete(wnd);
  189. }
  190.  
  191. /* ------------------------------------------------------------------------ */
  192. void waccent(void)
  193. {
  194.     WINDOW *wndA, *wndB, *wndC;
  195.     int c;
  196.  
  197.     Hset("waccent ", 20, 15);
  198.     wndA = Westablish(5, 5, 9, 28);
  199.     wndB = Westablish(10, 3, 9, 24);
  200.     wndC = Westablish(13, 8, 9, 31);
  201.     Wsetcolour(wndA, WIN_ALL, RED, YELLOW, DIM);
  202.     Wsetcolour(wndB, WIN_ALL, CYAN, YELLOW, DIM);
  203.     Wsetcolour(wndC, WIN_ALL, LIGHTGRAY, YELLOW, DIM);
  204.     Wshow(wndA);
  205.     Wshow(wndB);
  206.     Wshow(wndC);
  207.     Wprintf(wndA, "\n\n Press A to promote me");
  208.     Wprintf(wndB, "\n\n Press B to promote me");
  209.     Wprintf(wndC, "\n\n Press C to promote me");
  210.     do    {
  211.         c = kgetch();
  212.         switch (c)    {
  213.             case 'a':    Wforefront(wndA);
  214.                         break;
  215.             case 'b':    Wforefront(wndB);
  216.                         break;
  217.             case 'c':    Wforefront(wndC);
  218.                         break;
  219.             case 'A':    Wrear(wndA);
  220.                         break;
  221.             case 'B':    Wrear(wndB);
  222.                         break;
  223.             case 'C':    Wrear(wndC);
  224.                         break;
  225.             default:    break;
  226.         }
  227.     } while (c != ESC);
  228.     Wdelete(wndA);
  229.     kgetch();
  230.     Wdelete(wndC);
  231.     kgetch();
  232.     Wdelete(wndB);
  233. }
  234.  
  235.  
  236. #define MAXWINS    120
  237.  
  238. /* ------------------------------------------------------------------------ */
  239. void wfast(void)
  240. {
  241.     int x, xx, y, yy ,l;
  242.     int fg, bg;
  243.     unsigned ram;
  244.     char s[13];
  245.     WINDOW *wnd[MAXWINS];
  246.  
  247.     Hset("wfast   ", 20, 15);
  248.     for (l = 0 ; l < MAXWINS ; l++) {
  249.       ram = (unsigned) coreleft();
  250.       x = randx(0,67);
  251.       y = randx(0,21);
  252.       xx = randx(12,80-(x+1));
  253.       yy = randx(3,25-(y+1));
  254.       sprintf(s,"[Win %3d]",l);
  255.       if ((wnd[l] = Westablish(x, y, yy, xx)) == NULL)
  256.           break;                   /* break when no RAM free */
  257.       fg = randx(0,7);
  258.          while ( (bg = randx(0,7)) == fg);
  259.       Wsetcolour(wnd[l], WIN_ALL, fg, bg, BRIGHT);
  260.       Wsettitle(wnd[l],s,JUST_L);
  261.       Wsetborder(wnd[l],randx(0,4));
  262.       Wprintf(wnd[l],"%u bytes free.",ram);
  263.       Wshow(wnd[l]);
  264.     }
  265.     kgetch();
  266.     Wdelete(wnd[l]);
  267.     while(l--) {
  268.     Wdelete(wnd[l]);
  269.     }
  270. }
  271. #define  MAXWINS2    8
  272.  
  273. /* ------------------------------------------------------------------------ */
  274. void wfast2(void)
  275. {
  276.       int x = 0, c = 0, a = 7;
  277.       int l;
  278.       char s[7];
  279.       WINDOW *wnd[MAXWINS2];
  280.  
  281.       Hset("wfast   ", 20, 15);
  282.       vblinkbit(0);
  283.       for (l = 0 ; l < MAXWINS2 ; l++)     {
  284.         sprintf(s,"[Win %1d]",l);
  285.         wnd[l] = Westablish(x, c, 4, 24);
  286.         Wsetcolour(wnd[l], WIN_ALL, a++, BLACK, BRIGHT);
  287.         Wsettitle(wnd[l],s,JUST_L);
  288.         Wshow(wnd[l]);
  289.         Wprintf(wnd[l],"Press +- to toggle\nblink bit.");
  290.         c += 3;
  291.         x += 8;
  292.       }
  293.       while ((c = kgetch()) != ESC)  {
  294.         switch (c)   {
  295.          case  '+'  :  vblinkbit(1);
  296.                break;
  297.          case  '-'  :  vblinkbit(0);
  298.                break;
  299.         }
  300.       }
  301.  
  302.       while (l--)
  303.         Wdelete(wnd[l]);
  304.       vblinkbit(1);
  305. }
  306.  
  307.  
  308. /* ------------------------------------------------------------------------ */
  309. /*                             demo on editor                               */
  310. /* ------------------------------------------------------------------------ */
  311. void editor(void)
  312.  
  313. #define LWID      (int)80
  314. #define WHT       (int)14
  315. #define PADHT          20
  316.  
  317. {
  318.   char bf [PADHT] [LWID];
  319.   char notefile [] = "test.txt";
  320.   WINDOW *wnd;
  321.   FILE *fp, *fopen();
  322.   int i, ctr = 0;
  323.  
  324.     vshowcur();
  325.     Hset("editor  ", 20, 15);
  326.     setmem(bf, sizeof bf, ' ');
  327.     if ((fp = fopen(notefile, "rt")) != NULL)    {
  328.         while (fread(bf [ctr], LWID, 1, fp))
  329.             ctr++;
  330.         fclose(fp);
  331.     }
  332.     wnd = Westablish
  333.         ((80-(LWID+2))/2, (25-(WHT+2))/2, WHT+2, LWID+2);
  334.     Wsetborder(wnd, 3);
  335.     Wsettitle(wnd, "  Note Pad  ",JUST_C);
  336.     Wsetcolour(wnd, WIN_ALL, BLUE, CYAN, DIM);
  337.     Wsetcolour(wnd, WIN_ACCENT, CYAN, BLUE, DIM);
  338.     Wsetcolour(wnd, WIN_FACE, BLUE, WHITE, DIM);
  339.     Wshow(wnd);
  340.     Eopen(wnd, (char*) bf, LWID * PADHT);
  341.     Wdelete(wnd);
  342.     ctr = PADHT;
  343.     while (--ctr)    {
  344.         for (i = 0; i < LWID; i++)
  345.             if (bf [ctr] [i] != ' ')
  346.                 break;
  347.         if (i < LWID)
  348.             break;
  349.     }
  350.     fp = fopen(notefile, "w");
  351.     for (i = 0; i < ctr+1; i++)
  352.         fwrite(bf[i], LWID, 1, fp);
  353.     fclose(fp);
  354. }
  355.  
  356. struct {
  357.     char name [31];
  358.     char addr [41];
  359.     char city [26];
  360.     char state [3];
  361.     char pcode [4];
  362.     char amt [6];
  363.     char dt [7];
  364.     char phone [11];
  365. } rcd;
  366.  
  367. char msk40     [] = "________________________________________";
  368. char msk30     [] = "_______________________________";
  369. char msk25     [] = "__________________________";
  370. char mskamt    [] = "$___.__";
  371. char mskdate   [] = "__/__/__";
  372. char mskphone  [] = "(___) ___-____";
  373. char mskst     [] = "___";
  374. char mskpcode  [] = "____";
  375.  
  376. char *states[] = {
  377.       "WA ","NT ","QLD","NSW","VIC","TAS","SA ",NULL,
  378. };
  379. static int c = 5;
  380.  
  381. /* ------------------------------------------------------------------------ */
  382. /*                             select a state                               */
  383. /* ------------------------------------------------------------------------ */
  384. static void help_state(char *bf)
  385.  
  386. {
  387.    WINDOW *wnd;
  388.    char **s = states;
  389.  
  390.    if ((wnd = Westablish(58, 3, 9, 8)) == NULL)
  391.        return;
  392.    Wsettitle(wnd, "[States]", JUST_L);
  393.    Wsetcolour(wnd,WIN_BORDER,LIGHTGRAY,BLACK,DIM);
  394.    Wsetcolour(wnd,WIN_TITLE ,LIGHTGRAY,RED,DIM);
  395.    Wsetcolour(wnd,WIN_ACCENT,GREEN,BLACK,DIM);
  396.    Wsetcolour(wnd,WIN_FACE,LIGHTGRAY,BLACK,DIM);
  397.    Wshow(wnd);
  398.    while (*s)
  399.     Wprintf(wnd, "\n%s",*s++);
  400.    vhidecur();
  401.    c = Wgetsel(wnd, c, "1234567");
  402.    if (c)
  403.        memmove(bf,*(states+c-1),3);
  404.    Wdelete(wnd);
  405.    vshowcur();
  406. }
  407.  
  408. /* ------------------------------------------------------------------------ */
  409. /*                         demo on entry fields                             */
  410. /* ------------------------------------------------------------------------ */
  411. void entry(void)
  412. {
  413.     WINDOW *wnd;
  414.     FIELD *fld;
  415.  
  416.     vshowcur();
  417.     Hset("eorder  ", 20, 15);
  418.     wnd = Westablish(10, 5, 12, 56);
  419.     Wsettitle(wnd, "[ Order Entry ]",JUST_C);
  420.     Wsetfooter(wnd, "[ Footer ]",JUST_L);
  421.     Wsetcolour(wnd, WIN_BORDER,  LIGHTGRAY, WHITE, BRIGHT);
  422.     Wsetcolour(wnd, WIN_TITLE,   LIGHTGRAY, RED, DIM);
  423.     Wsetcolour(wnd, WIN_FACE,    LIGHTGRAY, BLACK, DIM);
  424.     Wsetcolour(wnd, WIN_ACCENT,  BLUE,      LIGHTGRAY, DIM);
  425.     Wsetcolour(wnd, WIN_FLDFACE, GREEN    , BLACK,  DIM);
  426.     Wshow(wnd);
  427.     Wprompt(wnd, 1, 1, "Name    ");
  428.     Wprompt(wnd, 1, 2, "Address ");
  429.     Wprompt(wnd, 1, 3, "City    ");
  430.     Wprompt(wnd, 1, 4, "State   ");
  431.     Wprompt(wnd, 14, 4, "Post code ");
  432.     Wprompt(wnd, 1, 6, "Amount  ");
  433.     Wprompt(wnd, 1, 7, "Date    ");
  434.     Wprompt(wnd, 1, 8, "Phone   ");
  435.     Finittemplate(wnd);
  436.     fld = Festablish(wnd, 9, 1, msk30, rcd.name, FLD_ALNUM,FLD_LJUST |
  437.                                FLD_TOPROPER);
  438.     fld = Festablish(wnd, 9, 2, msk40, rcd.addr, FLD_ALNUM,FLD_LJUST |
  439.                                FLD_TOPROPER);
  440.     fld = Festablish(wnd, 9 ,3, msk25, rcd.city, FLD_ALNUM,FLD_LJUST);
  441.     fld = Festablish(wnd, 9, 4, mskst, rcd.state, FLD_ALNUM,FLD_LJUST |
  442.                                 FLD_TOUPPER);
  443.     Fhelpfunc(fld, help_state,HELP_ALWAYS);
  444.     fld = Festablish(wnd, 24, 4, mskpcode, rcd.pcode, FLD_INT,FLD_LJUST);
  445.     fld = Festablish(wnd, 9, 6, mskamt, rcd.amt, FLD_CURR,FLD_ZFILL);
  446.     fld = Festablish(wnd, 9, 7, mskdate, rcd.dt, FLD_DATE,FLD_LJUST);
  447.     Fhelpfunc(fld, help_date,HELP_INITIAL);
  448.     fld = Festablish(wnd, 9, 8,mskphone,rcd.phone, FLD_INT,FLD_LJUST);
  449.     Fcleartemplate(wnd);
  450.     Fdataentry(wnd,0);
  451.     Wdelete(wnd);
  452. }
  453.  
  454. /* ------------------------------------------------------------------------ */
  455. /*                           provide today's date                           */
  456. /* ------------------------------------------------------------------------ */
  457. static void help_date(char *bf)
  458. {
  459.     struct date dat;
  460.  
  461.     getdate(&dat);
  462.     sprintf(bf, "%02d%02d%02d",dat.da_day, dat.da_mon, dat.da_year % 100);
  463. }
  464.  
  465. /* ------------------------------------------------------------------------ */
  466. /*                         demo 2 on entry fields                           */
  467. /* ------------------------------------------------------------------------ */
  468. void entryall(void)
  469. {
  470.  
  471. struct {
  472.     char alphanum [10];
  473.     char alpha [10];
  474.     char digit [10];
  475.     char ascii [10];
  476.     char print [10];
  477.     char xdigit [10];
  478.     char lower [10];
  479.     char upper [10];
  480.     char date [10];
  481.     char integer [4];
  482.     char curr    [5];
  483. } r;
  484.  
  485. char msk10  []    = "__________";
  486. char msk4   []    = "____";
  487. char mskcurr[]    = "$___.__";
  488.  
  489.     WINDOW *wnd;
  490.  
  491.     Hset("eall    ", 20, 15);
  492.     wnd = Westablish(10, 5, 18, 50);
  493.     Wsettitle(wnd, " Order Entry ",JUST_C);
  494.     Wsetcolour(wnd, WIN_ALL, BLUE, CYAN, DIM);
  495.     Wsetcolour(wnd, WIN_ACCENT, CYAN, BLACK, DIM);
  496.     Wshow(wnd);
  497.     Wprompt(wnd, 5, 2, "Alnum  :");
  498.     Wprompt(wnd, 5, 3, "Alpha  :");
  499.     Wprompt(wnd, 5, 4, "Digit  :");
  500.     Wprompt(wnd, 5, 5, "Ascii  :");
  501.     Wprompt(wnd, 5, 6, "Print  :");
  502.     Wprompt(wnd, 5, 7, "XDigit :");
  503.     Wprompt(wnd, 5, 8, "Lower  :");
  504.     Wprompt(wnd, 5, 9, "Upper  :");
  505.     Wprompt(wnd, 5, 10, "Date   :");
  506.     Wprompt(wnd, 5, 11, "Int    :");
  507.     Wprompt(wnd, 5, 12, "Curr   :");
  508.     Finittemplate(wnd);
  509.     Festablish(wnd, 15, 2,  msk10, r.alphanum, FLD_ALNUM,FLD_TOUPPER);
  510.     Festablish(wnd, 15, 3,  msk10, r.alpha, FLD_ALNUM,FLD_TOLOWER);
  511.     Festablish(wnd, 15, 4,  msk10, r.digit, FLD_DIGIT,JUST_R);
  512.     Festablish(wnd, 15, 5,  msk10, r.ascii, FLD_ASCII,JUST_L);
  513.     Festablish(wnd, 15, 6,  msk10, r.print, FLD_PRINT,0);
  514.     Festablish(wnd, 15, 7,  msk10, r.xdigit, FLD_XDIGIT,0);
  515.     Festablish(wnd, 15, 8,  msk10, r.lower, FLD_ALNUM,FLD_TOLOWER);
  516.     Festablish(wnd, 15, 9,  msk10, r.upper, FLD_ALNUM,FLD_TOUPPER);
  517.     Festablish(wnd, 15, 10, msk10, r.date, FLD_DATE,0);
  518.     Festablish(wnd, 15, 11, msk4,  r.integer, FLD_INT,0);
  519.     Festablish(wnd, 15, 12, mskcurr,  r.curr, FLD_CURR,0);
  520.     Fcleartemplate(wnd);
  521.     Fdataentry(wnd,0);
  522.     Wdelete(wnd);
  523. }
  524.  
  525. /* ------------------------------------------------------------------------ */
  526. /*                        show how a window can be moved                    */
  527. /* ------------------------------------------------------------------------ */
  528. void wmove(void)
  529. {
  530.     WINDOW *wndA, *wndB, *wndC;
  531.     int c;
  532.  
  533.     Hset("wmove   ", 20, 15);
  534.     wndA = Westablish(5, 5, 9, 31);
  535.     wndB = Westablish(10, 3, 9, 29);
  536.     wndC = Westablish(13, 8, 9, 32);
  537.     Wsetcolour(wndA, WIN_ALL, RED, YELLOW, BRIGHT);
  538.     Wsetcolour(wndB, WIN_ALL, CYAN, YELLOW, BRIGHT);
  539.     Wsetcolour(wndC, WIN_ALL, LIGHTGRAY, YELLOW, BRIGHT);
  540.     Wshow(wndA);
  541.     Wshow(wndB);
  542.     Wshow(wndC);
  543.     Wprintf(wndA, "\n I'm a less important window");
  544.     Wprintf(wndC, "\n I'm a more important window");
  545.     Wprintf(wndB, "\n     Actually a green");
  546.     Wprintf(wndB, "\n    caterpillar is the");
  547.     Wprintf(wndB, "\n ultimate visual evidence");
  548.     Wprintf(wndB, "\n  of a nasty virus attack");
  549.     Wprintf(wndB, "\n     on your computer.");
  550.     do    {
  551.         int x = 0, y = 0;
  552.         c = kgetch();
  553.         switch (c)    {
  554.             case RIGHT:    x++;
  555.                         break;
  556.             case LEFT:    --x;
  557.                         break;
  558.             case UP:    --y;
  559.                         break;
  560.             case DOWN:    y++;
  561.             default:    break;
  562.         }
  563.         if (x || y)
  564.             Wrmove(wndB, x, y);
  565.     } while (c != ESC);
  566.     Wdelete(wndA);
  567.     kgetch();
  568.     Wdelete(wndC);
  569.     kgetch();
  570.     Wdelete(wndB);
  571. }
  572.  
  573. /* ------------------------------------------------------------------------ */
  574. /*                            show direct video writes                      */
  575. /* ------------------------------------------------------------------------ */
  576. void video(void)
  577. {
  578.    int  x;
  579.  
  580.    Hset("dvideo  ", 20, 15);
  581.    vputs(0,0,CYAN,"Look at this cyan title");
  582.    for (x=1 ; x < 16 ; x++)
  583.       vputf(0,5+x,x,"This is attribute %d",x);
  584. }
  585.  
  586.  
  587.  
  588. static void get_list   (int s);
  589. static int ht          (char **tb);
  590. static int wd          (char **tb);
  591.  
  592. char *titles [] = {
  593.     " 1 - int ",
  594.     " 2 - char ",
  595.     " 3 - float ",
  596.     " 4 - unsigned ",
  597.     " 5 - double ",0
  598. };
  599. WINDOW *pno [] = {0, 0, 0, 0, 0};
  600. static int x [] = {20, 15, 29, 10, 17};
  601. static int y [] = {5, 10, 13, 18, 6};
  602. static int wcl [] [2] = {    {BLUE, WHITE},
  603.                 {MAGENTA, WHITE},
  604.                 {RED, WHITE},
  605.                 {GREEN, WHITE},
  606.                 {CYAN, WHITE}    };
  607. char *sel1 [] = {
  608.      "Integer data type",
  609.      " ",
  610.      "Variables of type int are one word in length.",
  611.      "They can be signed (default) or unsigned,",
  612.      "which means they have a range of -32,768 to",
  613.      "32,767 and 0 to 65,535, respectively.",
  614.      0
  615. };
  616.  
  617. char *sel2 [] = {
  618.  
  619.     "Character data type",
  620.     " ",
  621.     "Variables of type char are 1 byte in length.",
  622.     "They can be signed (default) or unsigned,",
  623.     "which means they have a range of -128 to 127",
  624.     "and 0 to 255, respectively.",
  625.     0
  626. };
  627.  
  628. char *sel3 [] = {
  629.     "Real number data type",
  630.     " ",
  631.     "Variables of type float are two words in",
  632.     "length. Their range is 3.4E-38 to 3.4E+38.",
  633.     " ",
  634.     "Use of float or double requires linking in the",
  635.     "floating-point math package. Turbo C++ will do",
  636.     "this automatically if you use floating point",
  637.     "in your program.",
  638.     0
  639. };
  640.  
  641. char *sel4 [] = {
  642.     "A type modifier alters the meaning of the base",
  643.     "type to yield a new type.",
  644.     " ",
  645.     "Each of these type modifiers can be applied to",
  646.     "the base type int.",
  647.     " ",
  648.     "The modifiers signed and unsigned can be",
  649.     "applied to the base type char.",
  650.     0
  651. };
  652.  
  653. char *sel5 [] = {
  654.     "Real number data types",
  655.     " ",
  656.     "Variables of type double are four words in",
  657.     "length. Their range is 1.7E-308 to 1.7E+308.",
  658.     "Variables of type long double are five words",
  659.     "in length. Their range is 3.4E-4932 to",
  660.     "1.1E+4932",
  661.     0
  662. };
  663. char **sel[] = {sel1,sel2,sel3,sel4,sel5,0};
  664.  
  665. /* ------------------------------------------------------------------------ */
  666. /*                           show how to make a list box                    */
  667. /* ------------------------------------------------------------------------ */
  668. void lists(void)
  669.  
  670. {
  671.     int s = 0, i, c;
  672.     WINDOW *mn;
  673.     char **cp;
  674.  
  675.     vsetcur(0, 25);
  676.     Hset("list    ", 20, 15);
  677.     mn = Westablish(0, 0, 7, 18);
  678.     Wsettitle(mn, " Select A Type ",JUST_C);
  679.     Wsetcolour(mn,WIN_BORDER,LIGHTGRAY,BLACK,DIM);
  680.     Wsetcolour(mn,WIN_TITLE ,LIGHTGRAY,RED,DIM);
  681.     Wsetcolour(mn,WIN_ACCENT,GREEN,BLACK,DIM);
  682.     Wsetcolour(mn,WIN_FACE,LIGHTGRAY,BLACK,DIM);
  683.     Wshow(mn);
  684.     cp = titles;
  685.     while (*cp)
  686.         Wprintf(mn, "\n%s", *cp++);
  687.     while (1)    {
  688.         Hset("listtest", 40, 10);
  689.         s = Wgetsel(mn, s+1, "12345");
  690.         if (s == 0)
  691.             break;
  692.         if (s == RIGHT || s == LEFT)    {
  693.             s = 0;
  694.             continue;
  695.         }
  696.         Whide(mn);
  697.         get_list(--s);
  698.         c = 0;
  699.         Hset("lists    ", 5, 15);
  700.         while (c != ESC)    {
  701.             c = kgetch();
  702.             switch (c)    {
  703.                 case RIGHT:    Wrmove(pno[s], 1, 0);
  704.                             break;
  705.                 case LEFT:    Wrmove(pno[s], -1, 0);
  706.                             break;
  707.                 case UP:    Wrmove(pno[s], 0, -1);
  708.                             break;
  709.                 case DOWN:    Wrmove(pno[s], 0, 1);
  710.                             break;
  711.                 case DEL:    Wdelete(pno[s]);
  712.                             pno[s] = NULL;
  713.                             break;
  714.                 case '+':    Wforefront(pno[s]);
  715.                             break;
  716.                 case '-':    Wrear(pno[s]);
  717.                 default:    break;
  718.             }
  719.             if (c > '0' && c < '6')
  720.                 get_list(s = c - '1');
  721.         }
  722.         Wforefront(mn);
  723.         Wshow(mn);
  724.     }
  725.     Wdeleteall();
  726.     for (i = 0; i < 5; i++)
  727.         pno[i] = NULL;
  728. }
  729.  
  730. /* ------------------------------------------------------------------------ */
  731. /*                           activate a list by number                      */
  732. /* ------------------------------------------------------------------------ */
  733. static void get_list(int s)
  734. {
  735.     char **cp;
  736.     static int lastp = -1;
  737.     if (lastp != -1)
  738.         Wsetintensity(pno[lastp], DIM);
  739.     lastp = s;
  740.     if (pno [s])
  741.         Wsetintensity(pno[s], BRIGHT);
  742.     else    {
  743.         pno [s] = Westablish
  744.             (x[s], y[s], ht(sel[s]), wd(sel[s]));
  745.         Wsettitle(pno[s], titles[s],JUST_C);
  746.         Wsetcolour(pno[s],WIN_ALL,wcl[s][0],wcl[s][1],BRIGHT);
  747.         Wsetborder(pno[s], 1);
  748.         Wshow(pno[s]);
  749.         cp = sel[s];
  750.         while (*cp)
  751.             Wprintf(pno[s], "\n %s", *cp++);
  752.     }
  753. }
  754. /* ------------------------------------------------------------------------ */
  755. /*                   compute height of a window display table               */
  756. /* ------------------------------------------------------------------------ */
  757. static int ht(char **tb)
  758. {
  759.     int h = 0;
  760.     while (*(tb + h++))    ;
  761.     return h + 3;
  762. }
  763. /* ------------------------------------------------------------------------ */
  764. /*                    compute width of a window display table               */
  765. /* ------------------------------------------------------------------------ */
  766. static int wd(char **tb)
  767. {
  768.     int w = 0;
  769.     while (*tb)        {
  770.         w = max(w, strlen(*tb));
  771.         tb++;
  772.     }
  773.     return w + 4;
  774. }
  775.  
  776.  
  777.  
  778. /* ------------------------------------------------------------------------ */
  779. /*                        pull down  menu tests                             */
  780. /* ------------------------------------------------------------------------ */
  781.  
  782. char *wselcs[] = {
  783.     " Flash Demo  ",
  784.     " Colour Demo ",
  785.     " Title Demo ",
  786.     " Border Demo ",
  787.     " Select Demo ",
  788.     " LotsaWindows Demo ",
  789.     " Blink bits ",
  790.     " Move Demo ",
  791.     NULL
  792. };
  793. char *wtselcs[] = {
  794.     " Lists ",
  795.     NULL
  796. };
  797. char *eselcs[] = {
  798.     " Orders ",
  799.     " All Orders ",
  800.     NULL
  801. };
  802. char *dselcs[] = {
  803.     " Editor ",
  804.     NULL
  805. };
  806. char *mselcs[] = {
  807.     " Direct Video ",
  808.     " Set 50 lines ",
  809.     " Set 43 lines ",
  810.     " Set 25 lines ",
  811.     NULL
  812. };
  813.  
  814. static void (*wfuncs[])()={windowsdemo,wcolours,wtitles,wborders,waccent,
  815.                wfast,wfast2,wmove};
  816. static void (*wtfuncs[])()={lists};
  817. static void (*efuncs[])()={entry,entryall};
  818. static void (*dfuncs[])()={editor};
  819. static void (*mfuncs[])()={video,vset50,vset43,vset25};
  820. static MENU mnu [] = {
  821.     {" Windows ",       wselcs,  wfuncs},
  822.     {" Window Tools ", wtselcs, wtfuncs},
  823.     {" Entrys ",      eselcs,  efuncs},
  824.     {" Editor ",      dselcs,  dfuncs},
  825.     {" Misc  ",       mselcs,  mfuncs},
  826.     {NULL,NULL,NULL}
  827. };
  828.  
  829.  
  830. void mainmenu(void)
  831. {
  832.     Hset("menu    ", 20, 15);
  833.     Msetcolour(WIN_BORDER,LIGHTGRAY,WHITE,DIM);
  834.     Msetcolour(WIN_TITLE ,LIGHTGRAY,YELLOW,DIM);
  835.     Msetcolour(WIN_ACCENT,GREEN,BLACK,DIM);
  836.     Msetcolour(WIN_FACE,LIGHTGRAY,BLACK,DIM);
  837.     Msettitle("[ SST Demo ]",JUST_C);
  838.     Msetfullwidth(1);
  839.     Msetspace(3, SPC_BETWEEN);
  840.     Mselect(mnu,TRUE);
  841. }
  842.  
  843.  
  844. extern int help_key = F1;
  845.  
  846. /* ------------------------------------------------------------------------ */
  847. void main(void)
  848.  
  849. {
  850.  vpushscreen();
  851.  vpushcur();
  852.  vfill(0,0,25,80,177,CYAN);
  853.  Hload("demo.hlp");
  854.  Hsettitle("[SST Help System]",JUST_L);
  855.  Hsetcolour(WIN_BORDER,GREEN,WHITE,BRIGHT);
  856.  Hsetcolour(WIN_TITLE,GREEN,YELLOW,DIM);
  857.  Hsetcolour(WIN_FACE,GREEN,BLACK,DIM);
  858.  Hsetborder(BRD_DOUBLE);
  859.  mainmenu();
  860.  vpopcur();
  861.  vshowcur();
  862.  vpopscreen();
  863. }
  864.  
  865.